<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      const inputData1 = [
        { 字段一: "甲", 字段二: "a", 字段三: 1 },
        { 字段一: "甲", 字段二: "a", 字段三: 2 },
        { 字段一: "甲", 字段二: "a", 字段三: 3 },
        { 字段一: "甲", 字段二: "b", 字段三: 1 },
        { 字段一: "甲", 字段二: "b", 字段三: 2 },
        { 字段一: "甲", 字段二: "b", 字段三: 3 },
        { 字段一: "乙", 字段二: "a", 字段三: 1 },
        { 字段一: "乙", 字段二: "a", 字段三: 2 },
        { 字段一: "乙", 字段二: "a", 字段三: 3 },
        { 字段一: "乙", 字段二: "b", 字段三: 1 },
        { 字段一: "乙", 字段二: "b", 字段三: 2 },
        { 字段一: "乙", 字段二: "b", 字段三: 3 },
      ];
      // 可能会有相同的
      const inputData2 = [
        { 字段一: "甲", 字段二: "a", 字段三: 1 },
        { 字段一: "甲", 字段二: "a", 字段三: 1 },
        { 字段一: "甲", 字段二: "a", 字段三: 3 },
        { 字段一: "甲", 字段二: "b", 字段三: 1 },
        { 字段一: "甲", 字段二: "b", 字段三: 2 },
        { 字段一: "甲", 字段二: "b", 字段三: 3 },
        { 字段一: "乙", 字段二: "a", 字段三: 1 },
        { 字段一: "乙", 字段二: "a", 字段三: 2 },
        { 字段一: "乙", 字段二: "a", 字段三: 3 },
        { 字段一: "乙", 字段二: "b", 字段三: 1 },
        { 字段一: "乙", 字段二: "b", 字段三: 2 },
        { 字段一: "乙", 字段二: "b", 字段三: 3 },
      ];

      // -拼接会感染结果
      const inputData3 = [
        { a: "-", b: "-" },
        { a: "-", b: "--" },
        { a: "--", b: "-" },
        { a: "--", b: "--" },
       
      ];
      function isFullCombination(datas) {
        const filedMap = new Map();
        if (datas.length === 0) {
          return false;
        }
        const keys = Object.keys(datas[0]);
        const combinationSet = new Set()
        const valueMap = new Map()
        let n = 1
        for (const item of datas) {
          let combination = ''
          for (const key of keys) {
            const value = item[key];
            let valueSet = filedMap.get(key);
            if (!valueSet) {
              valueSet = new Set();
              filedMap.set(key, valueSet);
            }
            valueSet.add(value);
            // 用数字和value对应
            let num = valueMap.get(value)
            if(!num){
              num = n++
              valueMap.set(value,num)
            }
            combination += `-${num}`
          }
          // 如果存在相同的就返回false
          if(combinationSet.has(combination)){
            return false
          }
          combinationSet.add(combination)
        }
        console.log(combinationSet)
        const n1 = [...filedMap].reduce((s, [, v]) => (s *= v.size), 1);
        const n2 = datas.length
        return n1 === n2
      }
      console.log(isFullCombination(inputData1));
      console.log(isFullCombination(inputData2));
      console.log(isFullCombination(inputData3));
    </script>
  </body>
</html>
